package com.cccyy.date;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public static void main(String[] args) throws Exception {
        // 获取当前日期
        Date currentDate = new Date();
        DateTime dateTime1 = DateUtil.nextMonth();
        DateTime dateTime = DateUtil.endOfMonth(dateTime1);

        System.out.println("当前日期: " + DATE_FORMAT.format(dateTime));

        // 向前推一个月
        Date oneMonthAgo = adjustDate(dateTime, Calendar.MONTH, -1);
        System.out.println("一个月前: " + DATE_FORMAT.format(oneMonthAgo));

        // 向前推一个季度（3个月）
        Date oneQuarterAgo = adjustDate(dateTime, Calendar.MONTH, -3);
        System.out.println("一个季度前: " + DATE_FORMAT.format(oneQuarterAgo));

        // 向前推半年（6个月）
        Date sixMonthsAgo = adjustDate(dateTime, Calendar.MONTH, -6);
        System.out.println("半年前: " + DATE_FORMAT.format(sixMonthsAgo));

        // 向前推一年
        Date oneYearAgo = adjustDate(dateTime, Calendar.YEAR, -1);
        System.out.println("一年前: " + DATE_FORMAT.format(oneYearAgo));
    }

    /**
     * 调整日期并处理边界条件
     *
     * @param baseDate 基准日期
     * @param field    调整的字段（Calendar.MONTH/YEAR）
     * @param amount   调整量（负值为向前推）
     * @return 调整后的有效日期
     */
    private static Date adjustDate(Date baseDate, int field, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(baseDate);
        calendar.add(field, amount);

        // 处理月份天数差异（如31号减到没有31号的月份）
        int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        if (calendar.get(Calendar.DAY_OF_MONTH) > maxDayOfMonth) {
            calendar.set(Calendar.DAY_OF_MONTH, maxDayOfMonth);
        }

        return calendar.getTime();
    }
}
